/*
	This file is part of AVRCppLib.

    AVRCppLib is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    AVRCppLib is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with AVRCppLib.  If not, see <http://www.gnu.org/licenses/>.

    Copyright (C) Maxime Lemonnier 2007-2011
 */

#include "RotationalSamplingPattern.h"


#include <string.h>

RotationalSamplingPattern::RotationalSamplingPattern(const char * name, const prog_mem * pattern, size_t repetitions) :
SamplingPattern(name, strlen(pattern), repetitions), patternIndex(0)
{
	this->pattern = strdup(pattern);
}

RotationalSamplingPattern::RotationalSamplingPattern(const char * name, const char * pattern, size_t repetitions) :
SamplingPattern(name, strlen(pattern), repetitions), patternIndex(0)
{
	this->pattern = strdup(pattern);
}

RotationalSamplingPattern::RotationalSamplingPattern(const char * name, uint8_t numberOfLabel, size_t repetitions) :
SamplingPattern(name, numberOfLabel, repetitions), patternIndex(0)
{
	this->pattern = new char[size];
	for (uint8_t i = 0; i < size; i++)
		pattern[i] = 'a' + i;
}


RotationalSamplingPattern::~RotationalSamplingPattern()
{
	delete pattern;
}

char RotationalSamplingPattern::nextLabel()
{
	patternIndex = (patternIndex + 1);

	if (patternIndex >= this->size)
	{
		this->repetitionsLeft--;

		if (this->repetitionsLeft == 0)
			this->exhausted = true;

		patternIndex %= size;
	}

	return pattern[patternIndex];
}

char RotationalSamplingPattern::currentLabel() const
{
	return pattern[patternIndex];
}

void RotationalSamplingPattern::reset()
{
	patternIndex = 0;
	this->repetitionsLeft = this->repetitions;
	this->exhausted = false;
}
